package com.better517na.stateprocess.state;

import com.better517na.stateprocess.model.ServiceResult;
import com.better517na.stateprocess.model.StateContext;

/**
 * 状态迁移动作接口
 * @param <T>
 * @param <C>
 */
public interface StateActionStep<T, C> {

    /**
     * 准备数据
     * @param context
     */
    default void prepare(StateContext<C> context) {}

    /**
     * 数据校验
     * @param context
     * @return
     */
    ServiceResult<T> check(StateContext<C> context);

    /**
     * 加锁
     * @param context
     * @return
     */
    Boolean isLock(StateContext<C> context);

    /**
     * 获取下一个状态
     * @param context
     * @return
     */
    String getNextState(StateContext<C> context);

    /**
     * 动作执行
     * @param nextState
     * @param context
     * @return
     * @throws Exception
     */
    ServiceResult<T> action(String nextState, StateContext<C> context) throws Exception;

    /**
     * 数据之旧话
     * @param nextState
     * @param context
     * @return
     * @throws Exception
     */
    ServiceResult<T> save(String nextState, StateContext<C> context) throws Exception;

    /**
     * 后续处理
     * @param context
     */
    void after(StateContext<C> context);
}
